﻿// 在G++ 4.4.0及vs2010下编译运行正确
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

const int maxsize = 20;

int map[maxsize][maxsize]; // 记录格子状态
bool used[maxsize * maxsize]; // 记录随机数被用过没有

int main() {
    int n = 10, m = 10; // 初始化方格维度
    srand((int)time(NULL)); // 设置随机种子
    memset(map, 0, sizeof(map)); // 初始化方格为0
    memset(used, false, sizeof(used)); // 初始化随机数未使用
    for (int i = 0; i < 10; ++i) { // 随机分布10个地雷，位置不同
        while (1) {
            int v = rand() % 100; // 取随机数
            if (used[v] == false) { // 如果没有取过这个随机数，则选用
                map[v / n][v % m] = -1; // 布雷
                used[v] = true;
                break;
            }
        }
    }
    for (int x = 0; x < n; ++x) {
        for (int y = 0; y < m; ++y) {
            if (map[x][y] != -1) { // 对于每一个没有地雷的格子，计算周围8个格子中地雷数量
                int cnt = 0; // 计数器，表示周围8个格子中雷的个数
                for (int i = -1; i <= +1; ++i) { // 遍历周围8个格子
                    for (int j = -1; j <= +1; ++j) {
                        if (i == 0 && j == 0) continue;
                        int tx = x + i, ty = y + j; // 取周围格子的坐标
                        if (tx >= 0 && tx < n && ty >= 0 && ty < m && map[tx][ty] == -1) { // 判断是否越界，如果不越界，是否是地雷
                            ++cnt; // 是地雷，计数器加1
                        }
                    }
                }
                map[x][y] = cnt; // 把当前格子数字记为周围8个格子中地雷的个数
            }
        }
    }
    // 输出方格
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            printf("%2d ", map[i][j]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}
